treeview: Make the parity actually store the row number
authorBenjamin Otte <otte@redhat.com>
Thu, 7 Jul 2011 06:48:06 +0000 (08:48 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 16 Nov 2011 03:31:06 +0000 (04:31 +0100)
Instead of just storing the least significant bit of the row number,
store the full row number. This will soon be useful for accessibility.
But CSS could like it, too.

gtk/gtkrbtree.c
gtk/gtkrbtree.h

index a912530779473d839aeacf0aa390751421925847..54d7067d10d599d3aae43a784c9941c10514bb06 100644 (file)
@@ -64,6 +64,7 @@ _gtk_rbnode_free (GtkRBNode *node)
       node->left = (gpointer) 0xdeadbeef;
       node->right = (gpointer) 0xdeadbeef;
       node->parent = (gpointer) 0xdeadbeef;
+      node->parity = 56789;
       node->offset = 56789;
       node->count = 56789;
       node->flags = 0;
@@ -382,6 +383,7 @@ _gtk_rbtree_remove (GtkRBTree *tree)
   GtkRBNode *tmp_node;
 
   gint height = tree->root->offset;
+  guint parity = tree->root->parity;
 
 #ifdef G_ENABLE_DEBUG  
   if (gtk_get_debug_flags () & GTK_DEBUG_TREE)
@@ -399,10 +401,7 @@ _gtk_rbtree_remove (GtkRBTree *tree)
     {
       _fixup_validation (tmp_tree, tmp_node);
       tmp_node->offset -= height;
-
-      /* If the removed tree was odd, flip all parents */
-      if (tree->root->parity)
-        tmp_node->parity = !tmp_node->parity;
+      tmp_node->parity -= parity;
       
       tmp_node = tmp_node->parent;
       if (tmp_node == tmp_tree->nil)
@@ -1498,7 +1497,6 @@ static guint
 get_parity (GtkRBNode *node)
 {
   guint child_total = 0;
-  guint rem;
 
   /* The parity of a node is node->parity minus
    * the parity of left, right, and children.
@@ -1515,12 +1513,7 @@ get_parity (GtkRBNode *node)
   if (node->children)
     child_total += (guint) node->children->root->parity;
 
-  rem = child_total % 2;
-  
-  if (rem == 0)
-    return node->parity;
-  else
-    return !node->parity;
+  return child_total + 1;
 }
 
 static guint
@@ -1538,13 +1531,11 @@ count_parity (GtkRBTree *tree,
     (guint)1 +
     (node->children ? count_parity (node->children, node->children->root) : 0);
 
-  res = res % (guint)2;
-  
   if (res != node->parity)
     g_print ("parity incorrect for node\n");
 
-  if (get_parity (node) != 1)
-    g_error ("Node has incorrect parity %u", get_parity (node));
+  if (get_parity (node) != node->parity)
+    g_error ("Node has incorrect parity %u, should be %u", node->parity, get_parity (node));
   
   return res;
 }
@@ -1717,7 +1708,7 @@ _gtk_rbtree_debug_spew_helper (GtkRBTree *tree,
           node,
           (GTK_RBNODE_GET_COLOR (node) == GTK_RBNODE_BLACK)?"BLACK":" RED ",
           node->offset,
-          node->parity?1:0,
+          node->parity,
           (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_DESCENDANTS_INVALID))?1:0,
           (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID))?1:0,
           (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_COLUMN_INVALID))?1:0);
index eec93a7fff39a6a5871a86d2b20612fad990ef80..9958d55677e7b595556fb1a0cab69f73ed67fb64 100644 (file)
@@ -66,17 +66,11 @@ struct _GtkRBNode
 {
   guint flags : 14;
 
-  /* We keep track of whether the aggregate count of children plus 1
-   * for the node itself comes to an even number.  The parity flag is
-   * the total count of children mod 2, where the total count of
-   * children gets computed in the same way that the total offset gets
-   * computed. i.e. not the same as the "count" field below which
-   * doesn't include children. We could replace parity with a
-   * full-size int field here, and then take % 2 to get the parity flag,
-   * but that would use extra memory.
+  /* count the number of total nodes beneath us, including nodes
+   * of children trees.
+   * i.e. node->left->count + node->right->count + node->children->root->count + 1
    */
-
-  guint parity : 1;
+  guint parity;
   
   GtkRBNode *left;
   GtkRBNode *right;